### プロジェクト30 スマートホーム **1. 説明** この技術の時代において、私たちは皆スマートホームに馴染みがあります。これはボタンを介して電気機器を制御できるシステムです。 本プロジェクトでは、IRリモコンを使ってスマートホームを模擬します。Arduino MCUをコアに、照明、エアコン、テレビ、セキュリティモニターの制御に利用できます。 **2. フローチャート** ![](media/B47.png) **3. 配線図** ![](media/B48.png) **4. テストコード** ``` /* keyestudio ESP32 Inventor Learning Kit Project 30 Smart Home http://www.keyestudio.com */ #include #include #include #include #include LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display const uint16_t recvPin = 19; // Infrared receiving pin IRrecv irrecv(recvPin); // Create a class object used to receive class decode_results results; // Create a decoding results class object long ir_rec; xht11 xht(26); //The DHT11 connects to IO26 unsigned char dat[] = { 0, 0, 0, 0 }; //Define an array to store temperature and humidity data int distance = 0; //Define a variable to receive the distance int EchoPin = 14; //Connect Echo pin to IO14 int TrigPin = 13; //Connect Trig pin to IO13 int ligth_sensor = 33; //Define the photoresistor pin int sound_sensor = 32; //efine the sound sensor pin int pot_sensor = 25; //Define the potentiometer pin void setup() { //LCD 1602 lcd.init(); // initialize the lcd lcd.backlight(); //Turn on the LCD backlight lcd.setCursor(3, 0); lcd.print("keyestudio"); //LCD displays "keyestudio" //IR receiver irrecv.enableIRIn(); // start receiving signals //Ultrasonic pinMode(TrigPin, OUTPUT); //Set Trig pin to output pinMode(EchoPin, INPUT); //Set Echo pin to input } void loop() { if (irrecv.decode(&results)) { if (results.value != 0) { //Prevent the button from being pressed repeatedly ir_rec = results.value; //The signal is assigned to the variable ir_rec show_clear(); } irrecv.resume(); //Release the IRremote and receive the next value. } switch (ir_rec) { case 0xFF02FD: show_clear(); break; case 0xFF6897: show_temperature(); break; case 0xFF9867: show_humidity(); break; case 0xFFB04F: show_distance(); break; case 0xFF30CF: show_luminance(); break; case 0xFF18E7: show_sound(); break; case 0xFF7A85: show_pot(); break; } delay(300); } void show_clear() { //Clear display lcd.setCursor(0, 1); lcd.print(" "); } void show_temperature() { //Display temperature if (xht.receive(dat)) { //Check correct return to true lcd.setCursor(0, 1); lcd.print("Temperature:"); lcd.setCursor(13, 1); lcd.print(dat[2]); if (dat[2] < 100) { lcd.setCursor(15, 1); lcd.print(" "); } } } void show_humidity() { //Display humidity if (xht.receive(dat)) { //Check correct return to true lcd.setCursor(0, 1); lcd.print("Humidity:"); lcd.setCursor(10, 1); lcd.print(dat[0]); Serial.println("2"); if (dat[0] < 100) { lcd.setCursor(12, 1); lcd.print(" "); } } } float checkdistance() { //Acquire distance // preserve a short low level to ensure a clear high pulse: digitalWrite(TrigPin, LOW); delayMicroseconds(2); // Trigger the sensor by a high pulse of 10um or longer digitalWrite(TrigPin, HIGH); delayMicroseconds(10); digitalWrite(TrigPin, LOW); // Read the signal from the sensor: a high level pulse //Duration is detected from the point sending "ping" command to the time receiving echo signal (unit: um). float distance = pulseIn(EchoPin, HIGH) / 58.00; //Convert into distance delay(10); return distance; } void show_distance() { //Display the distance distance = checkdistance(); // if (distance < 2 || distance >= 400) { //Disolay "-1" if exceeding the detection range // distance = -1; // } lcd.setCursor(0, 1); lcd.print("distance:"); lcd.setCursor(9, 1); lcd.print(distance); if (distance < 100 && distance > 10) { //Eliminate the third residual digit when the value drops to two digits lcd.setCursor(11, 1); lcd.print(" "); } if (distance < 10) { //Eliminate the second residual digit when the value drops to one digit lcd.setCursor(10, 1); lcd.print(" "); } } void show_luminance() //Read the analog value of photoresistor { int value = analogRead(ligth_sensor); lcd.setCursor(0, 1); lcd.print("Luminance:"); lcd.setCursor(11, 1); lcd.print(value); if (value < 1000) { lcd.setCursor(14, 1); lcd.print(" "); } if (value < 100) { lcd.setCursor(13, 1); lcd.print(" "); } if (value < 10) { lcd.setCursor(12, 1); lcd.print(" "); } } void show_sound() //Read the analog sound value { int value = analogRead(sound_sensor); lcd.setCursor(0, 1); lcd.print("Sound:"); lcd.setCursor(7, 1); lcd.print(value); if (value < 1000) { lcd.setCursor(10, 1); lcd.print(" "); } if (value < 100) { lcd.setCursor(9, 1); lcd.print(" "); } if (value < 10) { lcd.setCursor(8, 1); lcd.print(" "); } } void show_pot() //Read the analog value of potentiometer { int value = analogRead(pot_sensor); lcd.setCursor(0, 1); lcd.print("PotAnalog:"); lcd.setCursor(11, 1); lcd.print(value); if (value < 1000) { lcd.setCursor(14, 1); lcd.print(" "); } if (value < 100) { lcd.setCursor(13, 1); lcd.print(" "); } if (value < 10) { lcd.setCursor(12, 1); lcd.print(" "); } } ``` **5. テスト結果** 配線を接続しコードをアップロードした後、ボタンを押すとLCDに対応する内容が表示されます。OKボタンでセンサー表示をクリアします。 ![](media/B49.png)